﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.acwing.com/problem/content/530/
/*
题目描述：
现有一块大奶酪，它的高度为 h
，它的长度和宽度我们可以认为是无限大的，奶酪中间有许多半径相同的球形空洞。

我们可以在这块奶酪中建立空间坐标系，在坐标系中，奶酪的下表面为 z=0
，奶酪的上表面为 z=h
。 

现在，奶酪的下表面有一只小老鼠 Jerry，它知道奶酪中所有空洞的球心所在的坐标。

如果两个空洞相切或是相交，则 Jerry 可以从其中一个空洞跑到另一个空洞，特别地，
如果一个空洞与下表面相切或是相交，Jerry 则可以从奶酪下表面跑进空洞；如果一个空洞与上表面相切或是相交，
Jerry 则可以从空洞跑到奶酪上表面。

位于奶酪下表面的 Jerry 想知道，在不破坏奶酪的情况下，能否利用已有的空洞跑到奶酪的上表面去? 

空间内两点 P1(x1,y1,z1)、P2(x2,y2,z2)
 的距离公式如下：

dist(P1,P2)=(x1−x2)2+(y1−y2)2+(z1−z2)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
输入格式
每个输入文件包含多组数据。  

输入文件的第一行，包含一个正整数 T
，代表该输入文件中所含的数据组数。  

接下来是 T
 组数据，每组数据的格式如下：

第一行包含三个正整数 n，h
 和 r
，两个数之间以一个空格分开，分别代表奶酪中空洞的数量，奶酪的高度和空洞的半径。  

接下来的 n
 行，每行包含三个整数 x、y、z
，两个数之间以一个空格分开，表示空洞球心坐标为 (x,y,z)
。

输出格式
输出文件包含 T
 行，分别对应 T
 组数据的答案，如果在第 i
 组数据中，Jerry 能从下表面跑到上表面，则输出 Yes，如果不能，则输出 No。

数据范围
1≤n≤1000
,
1≤h,r≤109
,
T≤20
,
坐标的绝对值不超过109
输入样例：
3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4
输出样例：
Yes
No
Yes
*/

// 开始解题：
// 方法——并查集
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int n, h, r;
const int N = 1010;
struct sphere {
	int x;
	int y;
	int z;
} nodes[N];
int ufs[N];
// 并查集找根
int find(int x) {
	int root = x;
	while (ufs[root] >= 0) {
		root = ufs[root];
	}
	// 路径压缩
	while (ufs[x] >= root) {
		int parent = ufs[x];
		ufs[x] = root;
		x = parent;
	}
	return root;
}

// 并查集合并
void merge(int x, int y) {
	int root1 = find(x);
	int root2 = find(y);
	if (root1 == root2) {
		return;
	}
	if (abs(ufs[root1]) < abs(ufs[root2])) {
		swap(root1, root2);
	}
	ufs[root1] += ufs[root2];
	ufs[root2] = root1;
}

int main() {
	int t = 0;
	scanf("%d", &t);
	while (t--) {
		memset(ufs, -1, sizeof ufs); // 初始化并查集
		scanf("%d%d%d", &n, &h, &r);
		for (int i = 1; i <= n; i++) {
			int x = 0, y = 0, z = 0;
			scanf("%d%d%d", &x, &y, &z);
			nodes[i].x = x, nodes[i].y = y, nodes[i].z = z;
			if (abs(z) <= r) {
				merge(0, i);
			}
			if (abs(z - h) <= r) {
				merge(i, n + 1);
			}
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j < i; j++) {
				long long dx = nodes[i].x - nodes[j].x;
				long long dy = nodes[i].y - nodes[j].y;
				long long dz = nodes[i].z - nodes[j].z;
				if (dx * dx + dy * dy + dz * dz <= 4 * ((long long)r * r)) {
					merge(i, j);
				}
			}
		}
		if (find(0) == find(n + 1)) {
			cout << "Yes" << endl;
		}
		else {
			cout << "No" << endl;
		}
	}
	return 0;
}